// OneScript: ./OInt/core/Modules/OPI_Telegram.os
// Lib: Telegram
// CLI: telegram

// MIT License

// Copyright (c) 2023 Anton Tsitavets

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// https://github.com/Bayselonarrend/OpenIntegrations

// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnreachableCode-off
// BSLLS:CommentedCode-off

//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content

// Раскомментировать, если выполняется OneScript
// #Использовать "../../tools"

#Область ПрограммныйИнтерфейс

#Область ПолучениеДанныхИНастройка

// Получить информацию о боте
// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
// 
// Параметры:
//  Токен - Строка - Токен бота - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьИнформациюБота(Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL   = "api.telegram.org/bot" + Токен + "/getMe";
    Ответ = OPI_Инструменты.Get(URL);
    
    Возврат Ответ;

КонецФункции

// Получить обновления
// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
//
// Параметры:
//  Токен    - Строка       - Токен бота                             - token
//  Таймаут  - Строка,Число - Время ожидания новых событий           - timeout
//  Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL   = "api.telegram.org/bot" + Токен + "/getUpdates";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    Возврат Ответ;

КонецФункции

// Установить Webhook
// Устанавливает URL обработчика событий бота для работы в режиме Webhook 
//          
// Параметры:
//  Токен - Строка - Токен бота                                      - token
//  URL   - Строка - Адрес обработки запросов от Telegram (с https:) - url
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);

    URL   = "api.telegram.org/bot" + Токен + "/setWebHook";
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

// Удалить Webhook
// Удаляет URL обработчика событий бота для работы в режиме Webhook
// 
// Параметры:
//  Токен - Строка - Токен бота - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьWebhook(Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL   = "api.telegram.org/bot" + Токен + "/deleteWebHook";
    Ответ = OPI_Инструменты.Get(URL);
    
    Возврат Ответ;

КонецФункции

// Скачать файл
// Скачивает файл с серверов Telegram
// 
// Параметры:
//  Токен   - Строка - Токен                   - token
//  IDФайла - Строка - ID файла для скачивания - fileid
// 
// Возвращаемое значение:
//  ДвоичныеДанные - данные файла
Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт

    Result = "result";
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); 
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);    
            
    Параметры = Новый Структура("file_id", IDФайла);

    URL   = "api.telegram.org/bot" + Токен + "/getFile";
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Путь = Ответ[Result]["file_path"];
    
    Если Не ЗначениеЗаполнено(Путь) Тогда
        Возврат Ответ;
    КонецЕсли;
    
    URL   = "api.telegram.org/file/bot" + Токен + "/" + Путь;
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;   
    
КонецФункции

// ОбработатьДанные Telegram Mini App
// Обрабатывает данные TMA и опредеяет их достоверность
// 
// Параметры:
//  СтрокаДанных - Строка - querry из Telegram.WebApp.initData
//  Токен        - Строка - Токен бота
// 
// Возвращаемое значение:
//  Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);
    
    СтрокаДанных    = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
    СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
    КлючСтрокой     = "WebAppData";
    Хэш             = "";
    КлючДвоичные    = ПолучитьДвоичныеДанныеИзСтроки(КлючСтрокой);

    Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));

    ТЗнач = Новый ТаблицаЗначений;
    ТЗнач.Колонки.Добавить("Ключ");
    ТЗнач.Колонки.Добавить("Значение");

    Для Каждого Данные Из СтруктураДанных Цикл

        НоваяСтрока             = ТЗнач.Добавить();
        НоваяСтрока.Ключ        = Данные.Ключ;
        НоваяСтрока.Значение    = Данные.Значение;

    КонецЦикла;

    ТЗнач.Сортировать("Ключ");

    СоответствиеВозврата = Новый Соответствие;
    DCS                  = "";

    Для Каждого СтрокаТЗ Из ТЗнач Цикл

        Если СтрокаТЗ.Ключ <> "hash" Тогда
            DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
            СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
        Иначе
            Хэш = СтрокаТЗ.Значение;
        КонецЕсли;

    КонецЦикла;

    DCS     = Лев(DCS, СтрДлина(DCS) - 1);
    Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));

    Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);

    Если Финал = вРег(Хэш) Тогда
        Ответ = Истина;
    Иначе
        Ответ = Ложь;
    КонецЕсли;

    СоответствиеВозврата.Вставить("passed", Ответ);

    Возврат СоответствиеВозврата;

КонецФункции

#КонецОбласти

#Область ОтправкаДанных

// Отправить текстовое сообщение
// Отправляет текстовое сообщение в чат или канал
// 
// Параметры:
//  Токен       - Строка       - Токен бота                                        - token
//  IDЧата      - Строка,Число - ID целевого чата или IDЧата*IDТемы                - chat
//  Текст       - Строка       - Текст сообщения                                   - text
//  Клавиатура  - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка    - Строка       - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
//  IDВходящего - Строка,Число - ID сообщения на которое надо ответить             - reply
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьТекстовоеСообщение(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown"
	, Знач IDВходящего = 0) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);    
    OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);
            
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"         , Разметка   , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("text"               , Текст      , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup"       , Клавиатура , "СтрокаФайла", Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_to_message_id", IDВходящего, "Строка"     , Параметры);
    
    ДобавитьИдентификаторЧата(IDЧата, Параметры);
    
    URL   = "api.telegram.org/bot" + Токен + "/sendMessage";
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить картинку
// Отправляет картинку в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Картинка   - ДвоичныеДанные,Строка - Файл картинки                             - picture
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьКартинку(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Картинка
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);

КонецФункции

// Отправить видео
// Отправляет видео в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Видео      - ДвоичныеДанные,Строка - Файл видео                                - video
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьВидео(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Видео
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);

КонецФункции

// Отправить аудио
// Отправляет аудиофайл в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Аудио      - ДвоичныеДанные,Строка - Файл аудио                                - audio
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьАудио(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Аудио
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);

КонецФункции

// Отправить документ
// Отправляет документ в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Документ   - ДвоичныеДанные,Строка - Файл документа                            - doc
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьДокумент(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Документ
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка);

КонецФункции

// Отправить гифку
// Отправляет гифку в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  Гифка      - ДвоичныеДанные,Строка - Файл гифки                                - gif
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьГифку(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач Гифка
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт

    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);

КонецФункции

// Отправить группу медиафайлов
// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Текст      - Строка                - Текст сообщения                           - text
//  СоответствиеФайлов - Соответствие из Строка - Коллекция файлов  - media - JSON файлов или путь к .json
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМедиагруппу(Знач Токен
	, Знач IDЧата
	, Знач Текст
	, Знач СоответствиеФайлов
	, Знач Клавиатура = ""
	, Знач Разметка = "Markdown") Экспорт
    
    // СоответствиеФайлов
    // Ключ - Файл, Значение - Тип
    // Типы: audio, document, photo, video
    // Нельзя замешивать разные типы!

	Строка_ = "Строка";
	
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
    
    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);

    URL             = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
    СтруктураФайлов = Новый Структура;
    Медиа           = Новый Массив;
    Параметры       = Новый Структура;
    
    ДобавитьИдентификаторЧата(IDЧата, Параметры);
    СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
    
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("media"       , Медиа     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);

    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");

    Возврат Ответ;

КонецФункции

// Отправить местоположение
// Отправляет местоположение по географической широте и долготе в чат или канал
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Широта     - Строка,Число          - Географическая широта                     - lat
//  Долгота    - Строка,Число          - Географическая долгота                    - long
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт

	Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    
    URL = "api.telegram.org/bot" + Токен + "/sendLocation";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown" , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("latitude"    , Широта     , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("longitude"   , Долгота    , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);
    
    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить контакт
// Отправляет контакт с именем и номером телефона
// 
// Параметры:
//  Токен      - Строка                - Токен бота                                - token
//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
//  Имя        - Строка                - Имя контакта                              - name
//  Фамилия    - Строка                - Фамилия контакта                          - surname
//  Телефон    - Строка                - Телефон контакта                          - phone
//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт

	Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    
    URL = "api.telegram.org/bot" + Токен + "/sendContact";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown", Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("first_name"  , Имя       , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("last_name"   , Фамилия   , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("phone_number", Телефон   , Строка_      , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
    
    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Отправить опрос
// Отправляет опрос с вариантами ответа
// 
// Параметры:
//  Токен         - Строка                - Токен бота                                 - token
//  IDЧата        - Строка,Число          - ID целевого чата или IDЧата*IDТемы         - chat
//  Вопрос        - Строка                - Вопрос опроса                              - question
//  МассивОтветов - Массив из Строка      - Массив вариантов ответа                    - options
//  Анонимный     - Булево                - Анонимность опроса                         - anonymous
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);

    OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);
    
    URL = "api.telegram.org/bot" + Токен + "/sendPoll";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"   , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("question"  , Вопрос       , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("options"   , МассивОтветов, "СтрокаФайла", Параметры);
    
    Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));   
    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Переслать сообщение
// Пересылает сообщение между чатами или в рамках одного чата
// 
// Параметры:
//  Токен         - Строка       - Токен бота                         - token
//  IDОригинала   - Строка,Число - ID оригинального сообщения         - message
//  ОткудаID      - Строка,Число - ID чата оригинального сообщения    - from
//  КудаID        - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);
    
    URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID   , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id"  , IDОригинала, "Строка", Параметры);

    ДобавитьИдентификаторЧата(КудаID, Параметры);
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Сформировать клавиатуру по массиву кнопок
// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
// 
// Параметры:
//  МассивКнопок  - Массив из Строка - Массив кнопок                                        - buttons 
//  ПодСообщением - Булево           - Клавиатура под сообщением или на нижней панели       - under
//  ОднаПодОдной  - Булево           - Истина > кнопки выводятся в столбик, Ложь > в строку - column
// 
// Возвращаемое значение:
//  Строка -  JSON клавиатуры
Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
    , Знач ПодСообщением = Ложь
    , Знач ОднаПодОдной = Истина) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
    OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
    
    Если ОднаПодОдной Тогда
        Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
    Иначе
        Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
    КонецЕсли;

    Если ПодСообщением Тогда
        СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
    Иначе
        СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
    КонецЕсли;

    Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);

    Возврат Клавиатура;

КонецФункции

#КонецОбласти

#Область Администрирование

// Бан
// Банит пользователя в выбранном чате
// 
// Параметры:
//  Токен          - Строка       - Токен бота                         - token
//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
//  IDПользователя - Строка,Число - ID целевого пользователя           - user
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт

	Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/banChatMember";

    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"    , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата        , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("user_id"   , IDПользователя, Строка_, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Разбан
// Разбанивает забаненного ранее пользователя
// 
// Параметры:
//  Токен          - Строка       - Токен бота                         - token
//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
//  IDПользователя - Строка,Число - ID целевого пользователя           - user
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт

	Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";

    Параметры = Новый Структура;   
    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"    , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата        , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("user_id"       , IDПользователя, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь          , "Булево", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Создать ссылку-приглашение
// Создает ссылку для вступления в закрытый чат
// 
// Параметры:
//  Токен              - Строка         - Токен бота                                               - token
//  IDЧата             - Строка,Число   - ID целевого чата или IDЧата*IDТемы                       - chat
//  Заголовок          - Строка         - Заголовок приглашения                                    - title
//  ДатаИстечения      - Дата           - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
//  ЛимитПользователей - Число          - Лимит пользователей (бесконечно, если не указано)        - limit
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьСсылкуПриглашение(Знач Токен
    , Знач IDЧата
    , Знач Заголовок = ""
    , Знач ДатаИстечения = ""
    , Знач ЛимитПользователей = 0) Экспорт

	Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"        , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата            , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("name"          , Заголовок         , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("member_limit"  , ЛимитПользователей, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("expire_date"   , ДатаИстечения     , "Дата"  , Параметры);
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Закрепить сообщение
// Закрепляет сообщение в шапке чата
// 
// Параметры:
//  Токен       - Строка       - Токен                 - token
//  IDЧата      - Строка,Число - ID целевого чата      - chat
//  IDСообщения - Строка,Число - ID целевого сообщения - message
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
    
    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"          , "Markdown" , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата     , Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id"          , IDСообщения, Строка_ , Параметры);
    OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь       , "Булево", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Открепить сообщение
// Открепляет сообщение в шапке чата
// 
// Параметры:
//  Токен       - Строка       - Токен бота            - token
//  IDЧата      - Строка,Число - ID целевого чата      - chat
//  IDСообщения - Строка,Число - ID целевого сообщения - message
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
    
    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Получить число участников
// Получает общее число участников чата
// 
// Параметры:
//  Токен  - Строка       - Токен бота       - token
//  IDЧата - Строка,Число - ID целевого чата - chat
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);

    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;

КонецФункции

// Удалить сообщение
// Удаляет указанное сообщение из чата или канала
// 
// Параметры:
//  Токен       - Строка       - Токен                    - token
//  IDЧата      - Строка,Число - ID целевого чата         - chat
//  IDСообщения - Строка,Число - ID удаляемого сообщения  - message
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
	
	OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
	
	URL = "api.telegram.org/bot" + Токен + "/deleteMessage";
	
	Параметры = Новый Структура;
	OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, "Строка", Параметры);
	OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);
	
	Ответ = OPI_Инструменты.Get(URL, Параметры);
	Возврат Ответ;

КонецФункции

#КонецОбласти

#Область РаботаСТемамиФорума

// Получить список иконок-аватаров
// Получает соответствие ID Emoji для установки в качестве иконок тем форума
// 
// Параметры:
//  Токен - Строка - Токен - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    Result    = "result";
    URL       = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";     
    Ответ     = OPI_Инструменты.Get(URL);    
    Иконки    = Ответ[Result];
    
    Если Не ЗначениеЗаполнено(Иконки) Тогда
    	Возврат Ответ;
    КонецЕсли; 
    
    Коллекция = Новый Соответствие;
    
    Для Каждого Иконка Из Иконки Цикл
        Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
    КонецЦикла;
       
    Возврат Коллекция;

КонецФункции

// Создать тему форума
// Создает новую тему в группе с включенным функционалом тем
// 
// Параметры:
//  Токен     - Строка       - Токен                            - token
//  IDЧата    - Строка,Число - ID чата создания темы            - forum
//  Заголовок - Строка       - Заголовок темы                   - title
//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
	
    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
    
КонецФункции

// Изменить тему форума
// Создает новую тему в группе с включенным функционалом тем
// 
// Параметры:
//  Токен     - Строка       - Токен                            - token
//  IDЧата    - Строка,Число - ID чата создания темы            - forum
//  IDТемы    - Строка,Число - ID темы                          - topic
//  Заголовок - Строка       - Новый заголовок                  - title
//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьТемуФорума(Знач Токен
    , Знач IDЧата
    , Знач IDТемы
    , Знач Заголовок = Неопределено
    , Знач IDИконки = Неопределено) Экспорт   
     
    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
КонецФункции

// Закрыть тему форума
// Закрывает тему для новых сообщений
// 
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
	
    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);  
      
КонецФункции

// Открыть тему форума
// Повторно открывает ранее закрытую тему форума
// 
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
	
    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы); 
       
КонецФункции

// Удалить тему форума
// Удаляет тему форума
// 
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
//  IDТемы - Строка,Число - ID темы      - topic
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
	
    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);   
     
КонецФункции

// Скрыть главную тему форума
// Скрывает главную тему форума
// 
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
	
    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
    
КонецФункции

// Показать главную тему форума
// Показывает ранее скрытую главную тему форума
// 
// Параметры:
//  Токен  - Строка       - Токен        - token
//  IDЧата - Строка,Число - ID чата темы - forum
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
	
    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
    
КонецФункции

// Изменить имя главной темы форума
// Изменяет имя главной темы форума
// 
// Параметры:
//  Токен     - Строка       - Токен                   - token
//  IDЧата    - Строка,Число - ID чата темы            - forum
//  Заголовок - Строка       - Новое имя главной темы  - title
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата   , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("name"   , Заголовок, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

// Очистить список закрепленных сообщений темы
// Очищает список закрепленных сообщений в теме форума
// 
// Параметры:
//  Токен  - Строка       - Токен                               - token
//  IDЧата - Строка,Число - ID чата темы                        - forum
//  IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
    
    Если ЗначениеЗаполнено(IDТемы) Тогда
        Метод = "/unpinAllForumTopicMessages";
    Иначе
        Метод = "/unpinAllGeneralForumTopicMessages";
    КонецЕсли;
        
    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка)

    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);

    Расширение  = "";
    Метод       = "";
    
    ОпределитьМетодОтправки(Вид, Метод, Расширение);
    ПреобразоватьДанныеФайла(Файл, Расширение, Вид);
    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , "Строка"     , Параметры);
    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
    
    ДобавитьИдентификаторЧата(IDЧата, Параметры);

    СтруктураФайлов = Новый Структура;
    СтруктураФайлов.Вставить(Вид + Расширение, Файл);

    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");

    Возврат Ответ;

КонецФункции

Функция УправлениеТемойФорума(Знач Токен
    , Знач IDЧата
    , Знач Заголовок = Неопределено
    , Знач IDИконки = Неопределено
    , Знач IDТемы = "")
    
    Строка_ = "Строка";
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("name"                , Заголовок, Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата   , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id"   , IDТемы   , Строка_, Параметры);
    
    Если ЗначениеЗаполнено(IDТемы) Тогда
        Метод  = "/editForumTopic";    
    Иначе    
        Метод = "/createForumTopic";    
    КонецЕсли;
    
    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);       
    Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);
    
    Возврат Ответ;

КонецФункции

Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") 
        
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    Если ЗначениеЗаполнено(IDТемы) Тогда
        Форум = "Forum";
    Иначе
        Форум = "GeneralForum";
    КонецЕсли;
    
    Метод     = ОпределитьМетодУправленияФорумом(Статус, Форум);
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
   
    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);

    Возврат Ответ;
    
КонецФункции

Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);

    Если Скрыть Тогда
        Метод = "/hideGeneralForumTopic";
    Иначе
        Метод = "/unhideGeneralForumTopic";
    КонецЕсли;
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);
    
    URL   = "api.telegram.org/bot" + Токен + Метод;
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;

КонецФункции                 

Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) 
    
    Открыть = 1;
    Закрыть = 2;
    Удалить = 3;
    
    Если Статус = Открыть Тогда 
        Метод = "/reopen" + Форум + "Topic";
    ИначеЕсли Статус = Закрыть Тогда
        Метод = "/close" + Форум + "Topic";
    ИначеЕсли Статус = Удалить Тогда
        Метод = "/deleteForumTopic";
    Иначе 
        ВызватьИсключение "Некорректный статус управления форумом";
    КонецЕсли;
    
    Возврат Метод;

КонецФункции

Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)
    
    Строки = Новый Массив;
    
    Для Каждого Кнопка Из МассивКнопок Цикл
        Кнопки = Новый Массив;
        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
        Строки.Добавить(Кнопки);
    КонецЦикла;

    Возврат Строки;
    
КонецФункции

Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
    
    Строки = Новый Массив;
    Кнопки = Новый Массив;
    
    Для Каждого Кнопка Из МассивКнопок Цикл
        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
    КонецЦикла;
    
    Строки.Добавить(Кнопки);
    
    Возврат Строки;

КонецФункции

Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа)
    
    Счетчик = 0;
    
    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
    
    Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
        // !OInt ВызватьИсключение("Не удалось получить информацию из json медиа!");
        Возврат;
    КонецЕсли;
   
    Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
        
        Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
            
            Двоичные = ТекущийФайл.Ключ;
            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные);
            
            ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);           
            ИмяМедиа = ТекущийФайл.Значение 
                + Строка(Счетчик) 
                + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
                
            ПолноеИмяМедиа  = СтрЗаменить(ИмяМедиа, ".", "___");
            
        Иначе
            Двоичные        = ТекущийФайл.Ключ;
            ИмяМедиа        = ТекущийФайл.Значение + Строка(Счетчик);
            ПолноеИмяМедиа  = ИмяМедиа;
        КонецЕсли;
        
        СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные);
        
        СтруктураМедиа = Новый Структура;
        СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение);
        СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
        
        Если Счетчик = 0 Тогда
            СтруктураМедиа.Вставить("caption", Текст);
        КонецЕсли;
        
        Медиа.Добавить(СтруктураМедиа);
        
        Счетчик = Счетчик + 1;
        
    КонецЦикла;

    Медиа = OPI_Инструменты.JSONСтрокой(Медиа);
    
КонецПроцедуры

Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)
    
    IDЧата     = OPI_Инструменты.ЧислоВСтроку(IDЧата);
    МассивЧата = СтрРазделить(IDЧата, "*", Ложь);
    
    Если МассивЧата.Количество() > 1 Тогда
        
        IDЧата = МассивЧата[0];
        IDТемы = МассивЧата[1];
        
        Параметры.Вставить("message_thread_id", IDТемы);
        
    КонецЕсли;
    
    Параметры.Вставить("chat_id", IDЧата);

КонецПроцедуры

Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение)
    
    Если Вид = "photo" Тогда
        Метод = "/sendPhoto";
    ИначеЕсли Вид = "video" Тогда
        Метод = "/sendVideo";
    ИначеЕсли Вид = "audio" Тогда
        Метод = "/sendAudio";
    ИначеЕсли Вид = "document" Тогда
        Метод = "/sendDocument";
    ИначеЕсли Вид = "animation" Тогда
        Метод = "/sendAnimation";
        Расширение = ".gif";
    Иначе
        ВызватьИсключение "Некорректный вид отправки";
    КонецЕсли;

КонецПроцедуры

Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид)
    
    Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
        
        ТекущийФайл = Новый Файл(Файл);
        Расширение  = ?(Вид = "document", ТекущийФайл.Расширение, Расширение);
        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
        
    КонецЕсли;

    Расширение = СтрЗаменить(Расширение, ".", "___");
    
КонецПроцедуры

#КонецОбласти
